package com.yc.sole.framework.enums;

import lombok.Getter;
import org.springframework.validation.FieldError;

/**
 * @author yizuomin
 * @date 2024/1/22 21:17
 **/
@Getter
public enum ValidatedEnum {


    TEMP("Temp", ""), //临时对象，避免模板提示信息中占位符被使用，因枚举对象属于全局对象
    NULL("Null", "请求参数错误,%s参数值必须是空."),
    NOT_NULL("NotNull", "请求参数错误,%s参数为空."),
    NOT_BLANK("NotBlank", "请求参数错误,%s参数为空."),
    NOT_EMPTY("NotEmpty", "请求参数错误,%s参数为空."),
    MIN("Min", "请求参数错误,%s参数必须大于等于%s."),
    MAX("Max", "请求参数错误,%s参数必须小于等于%s."),
    SIZE("Size", "请求参数错误,%s参数字符长度必须不大于%s且不小于%s."),
    ;
    /**
     * 验证枚举名称
     */
    private String code;

    /**
     * 中文提示模板
     */
    private String message;

    public ValidatedEnum setCode(String code) {
        this.code = code;
        return this;
    }

    public ValidatedEnum setMessage(String message) {
        this.message = message;
        return this;
    }

    ValidatedEnum(String code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * 通过验证成员变量错误信息获取对应枚举对象并合成信息
     *
     * @param fieldError
     * @return
     * @author rufeng
     * @date 2023/12/18 15:22
     */
    public static ValidatedEnum getInstanceByFieldError(FieldError fieldError) {
        ValidatedEnum[] validatedEnums = values();
        ValidatedEnum ve = TEMP;
        for (ValidatedEnum validatedEnum : validatedEnums) {
            if (validatedEnum.getCode().equals(fieldError.getCode())) {
                //获取到code注解的值，数组个数一定要与占位符数相同
                Object[] arugments = fieldError.getArguments();
                arugments[0] = fieldError.getField();
                ve.setCode(validatedEnum.getCode()).setMessage(String.format(validatedEnum.getMessage(), arugments));
                return ve;
            }
        }
        return null;
    }
}
